home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 February / PCWorld_2008-02_cd.bin / audio-video / reaper / reaper2028-install.exe / Effects / Till / Transient-driven Auto-Pan v1.0 (Master) < prev    next >
Text File  |  2007-12-03  |  7KB  |  308 lines

  1. // written by Till
  2. //
  3. // note: the effect sends data to regx. x is specified by the "send pan data to" slider
  4. //
  5. // note: the lookahead must be compensated manually
  6. //
  7. //
  8. //
  9. desc: Transient-driven Auto-Pan (Master)
  10. slider1:0<0,2,1{Stereo,Left,Right}>Input
  11. slider2:3<0,3,1{Left to Right,Right to Left,Bounce,Random (Ignores Pan/Random step size)}>Pan Mode
  12. slider3:10<0,100,1>Pan step size (%)
  13. slider4:0<0,100,1>Random step size (% +/-)
  14. slider5:100<1,100,1>Max. Pan
  15. slider6:20<0,1000,1>Fade time (ms)
  16. slider7:0<0,10,1>Sloppiness (Master-only)
  17. slider8:250<20,500,1>Min. pause between Pans (ms)
  18. slider9:0<0,10,1>Max Delay (ms)
  19. slider11:0<0,5,1{Left+Right,Left,Right,Sidechain Left+Right,Sidechain Left,Sidechain Right}>Director
  20. slider12:0<0,1,1{No,Yes}>Preview Director
  21. slider13:5<0,10,.1>Sensitivity
  22. slider14:0<0,100,1>Look-ahead (ms)
  23. slider15:0<0,10,1{Off,reg00,reg01,reg02,reg03,reg04,reg05,reg06,reg07,reg08,reg09}>Send Pan data to
  24. slider16:0<-100,100,1>Current Pan
  25.  
  26.  
  27. /////////////////
  28. ///           ///
  29. ///  I N I T  ///
  30. ///           ///
  31. /////////////////
  32.  
  33. @init
  34.  
  35.     log2 = log(2);
  36.     sqrt2 = sqrt(2);
  37.  
  38.     curgain = 1;
  39.     curgaindb = 0;
  40.     splsincelastpan = 0;
  41.     now = 0;
  42.     curpan = 0;
  43.     sloppypan = 0;
  44.     targetpan = 0;
  45.     lastpan = 0;
  46.     forth = 1;
  47.  
  48.     maxdelay = ceil((10 + 100) / 1000 * srate);
  49.  
  50.     delaybufferl = 0;
  51.     delaybufferr = 2 * maxdelay;
  52.  
  53.     delaypointer = 0;
  54.  
  55.     rmswindow = 50 / 1000 * srate;
  56.     rmsbuffer = 4 * maxdelay;
  57.  
  58.     rmssum = 0;
  59.     rmsp = 0;
  60.  
  61. /////////////////
  62. ///           ///
  63. ///  SLIDER   ///
  64. ///           ///
  65. /////////////////
  66.  
  67. @slider
  68.  
  69.     // SLIDER VALUES
  70.  
  71.     input = slider1;
  72.  
  73.     mode = slider2;
  74.  
  75.     stepsize = slider3;
  76.     randomstepsize = slider4;
  77.  
  78.     maxpan = slider5;
  79.  
  80.     fadetime = slider6 / 1000 * srate;
  81.     sloppiness = slider7;
  82.  
  83.     pause = slider8 / 1000 * srate;
  84.  
  85.     delay = slider9 / 1000 * srate;
  86.  
  87.     director = slider11;
  88.  
  89.     preview = slider12;
  90.     
  91.     sensitivity = slider13;
  92.  
  93.     lookahead = slider14 / 1000 * srate;
  94.  
  95.     sendto = slider15;
  96.  
  97.     attack = max(1, sqr(sensitivity) * 0.003 * srate);
  98.     release = max(1, pause / 2);
  99.  
  100.     tolerancedb = 12 - sensitivity;
  101.     tolerance = 2 ^ (tolerancedb / 6);
  102.  
  103.     minrms = 2 ^ (-5 - sensitivity / 2);
  104.  
  105. /////////////////
  106. ///           ///
  107. ///  SAMPLE   ///
  108. ///           ///
  109. /////////////////
  110.  
  111. @sample
  112.  
  113.     // choosing input
  114.  
  115.     input == 0 ? (
  116.         l = spl0;
  117.         r = spl1;
  118.     ) : input == 1 ? (
  119.         l = spl0;
  120.         r = spl0;
  121.     ) : input == 2 ? (
  122.         l = spl1;
  123.         r = spl1;
  124.     ) : 0;
  125.  
  126.     // buffering
  127.  
  128.     delaybufferl[delaypointer] = l;
  129.     delaybufferl[delaypointer + maxdelay] = l;
  130.     delaybufferr[delaypointer] = r;
  131.     delaybufferr[delaypointer + maxdelay] = r;
  132.  
  133.     // choosing director
  134.  
  135.     director == 0 ? (
  136.         dl = spl0;
  137.         dr = spl1;
  138.     ) : director == 1 ? (
  139.         dl = spl0;
  140.         dr = spl0;
  141.     ) : director == 2 ? (
  142.         dl = spl1;
  143.         dr = spl1;
  144.     ) : director == 3 ? (
  145.         dl = spl2;
  146.         dr = spl3;
  147.     ) : director == 4 ? (
  148.         dl = spl2;
  149.         dr = spl2;
  150.     ) : director == 5 ? (
  151.         dl = spl3;
  152.         dr = spl3;
  153.     ) : 0;
  154.  
  155.     cursample = (abs(dl) + abs(dr)) / 2;
  156.  
  157. // calcing rms power
  158.  
  159.     rmssum -= rmsbuffer[rmsp];
  160.  
  161.     rmssum += sqr(cursample);
  162.  
  163.     rmsbuffer[rmsp] = sqr(cursample);
  164.  
  165.     rms = max(sqrt(rmssum / rmswindow), minrms);
  166.  
  167.     rmsp+=1;
  168.     rmsp >= rmswindow && rmsp = 0;
  169.  
  170.     threshold = rms * 1.68;
  171.     thresholddb = 6 * log(threshold) / log2 + 3;
  172.  
  173. // detecting
  174.  
  175.     (cursample >= threshold) ? (
  176.         cursampledb = 6 * log(cursample) / log2;
  177.         targetgaindb = thresholddb - cursampledb;
  178.     ) : (
  179.         targetgaindb = 0;
  180.     );
  181.  
  182.     targetgaindb > curgaindb ? (
  183.         curgaindb += (targetgaindb - curgaindb) / release;
  184.     ) : (
  185.         curgaindb += (targetgaindb - curgaindb) / attack;
  186.     );
  187.  
  188.     curgain = exp((curgaindb / 6) * log2);
  189.  
  190.     detector = cursample * curgain;
  191.  
  192. // panning
  193.  
  194.     pop = 0;
  195.     now ? (
  196.         (splsincelastpan > pause) && now = 0;
  197.     ) : (
  198.         detector > threshold * tolerance && (
  199.             pop = 1;
  200.             now = 1;
  201.             splsincelastpan = 0;
  202.             lastpan = curpan;
  203.             mode == 0 ? (
  204.                 targetpan = curpan + stepsize + (rand(2) - 1) * randomstepsize;
  205.                 targetpan < -maxpan && (targetpan += 2 * maxpan);
  206.                 targetpan > maxpan && (targetpan -= 2 * maxpan);
  207.             ) : mode == 1 ? (
  208.                 targetpan = curpan - stepsize - (rand(2) - 1) * randomstepsize;
  209.                 targetpan > maxpan && (targetpan -= 2 * maxpan);
  210.                 targetpan < -maxpan && (targetpan += 2 * maxpan);
  211.             ) : mode == 2 ? (
  212.                 forth ? (
  213.                     targetpan = curpan + stepsize + (rand(2) - 1) * randomstepsize;
  214.                 ) : (
  215.                     targetpan = curpan - stepsize - (rand(2) - 1) * randomstepsize;
  216.                 );
  217.                 targetpan > maxpan && (
  218.                     targetpan = 2 * maxpan - targetpan;
  219.                     forth = 0;
  220.                 );
  221.                 targetpan < -maxpan && (
  222.                     targetpan = - 2* maxpan - targetpan;
  223.                     forth = 1;
  224.                 );
  225.             ) : (
  226.                 targetpan = ceil((rand(2) - 1) * maxpan);
  227.             );
  228.         );
  229.     );
  230.  
  231.     splsincelastpan += 1;
  232.  
  233. //fading the pan
  234.  
  235.     curpan != targetpan && (
  236.         fadepos = splsincelastpan / fadetime;
  237.         fadepos = (-cos(min(fadepos, 1) * $pi) + 1) / 2;
  238.         curpan = lastpan + (targetpan - lastpan) * fadepos;
  239.     );
  240.  
  241. // sending pan info
  242.  
  243.     sendto > 0 && (
  244.         sendto == 1 ? (
  245.             reg00 = curpan;
  246.         ) : sendto == 2 ? (
  247.             reg01 = curpan;
  248.         ) : sendto == 3 ? (
  249.             reg02 = curpan;
  250.         ) : sendto == 4 ? (
  251.             reg03 = curpan;
  252.         ) : sendto == 5 ? (
  253.             reg04 = curpan;
  254.         ) : sendto == 6 ? (
  255.             reg05 = curpan;
  256.         ) : sendto == 7 ? (
  257.             reg06 = curpan;
  258.         ) : sendto == 8 ? (
  259.             reg07 = curpan;
  260.         ) : sendto == 9 ? (
  261.             reg08 = curpan;
  262.         ) : sendto == 10 ? (
  263.             reg09 = curpan;
  264.         ) : 0;
  265.     );
  266.  
  267. // sloppiness
  268.  
  269.     s = sloppiness * sloppiness * sloppiness * sloppiness;
  270.     sloppypan = (curpan + s * sloppypan) / (s + 1);
  271.  
  272. // calculating the actual volumes
  273.  
  274.     abspan = abs(sloppypan);
  275.     dominantpandb = 6 * abspan / 100;
  276.     dominantpan = exp((dominantpandb / 6) * log2);
  277.     recessivepan = 2 - dominantpan;
  278.  
  279. // leveling
  280.  
  281.     sloppypan > 0 ? (
  282.         r = dominantpan * delaybufferr[maxdelay + delaypointer - lookahead];
  283.         x = abspan / 100 * delay;
  284.         f = x - floor(x);
  285.         c = floor(x + 1) - x;
  286.         l = recessivepan * (c * delaybufferl[maxdelay + delaypointer - floor(abspan / 100 * delay) - lookahead] + f * delaybufferl[maxdelay + delaypointer - ceil(abspan / 100 * delay) - lookahead]);
  287.     ) : (
  288.         l = dominantpan * delaybufferl[maxdelay + delaypointer - lookahead];
  289.         x = abspan / 100 * delay;
  290.         f = x - floor(x);
  291.         c = floor(x + 1) - x;
  292.         r = recessivepan * (c * delaybufferr[maxdelay + delaypointer - floor(abspan / 100 * delay) - lookahead] + f * delaybufferr[maxdelay + delaypointer - ceil(abspan / 100 * delay) - lookahead]);
  293.     );
  294.     
  295. // outputting
  296.  
  297.     preview ? (
  298.         spl0 = dl;
  299.         spl1 = pop;
  300.     ) : (
  301.         spl0 = l;
  302.         spl1 = r;
  303.     );
  304.  
  305.     slider16 = curpan;
  306.  
  307.     delaypointer += 1;
  308.     delaypointer >= maxdelay && (delaypointer = 0);